const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs');
const database = require('./utils/database');
const userRoutes = require('./routes/user');
const adminRoutes = require('./routes/admin');
const exportUtils = require('./utils/export');

const app = express();
const PORT = process.env.PORT || 3000;

/**
 * 维修上报系统 - 轻量化版本
 * 基于Express + SQLite + Vue3(CDN)
 */

// 防止重复启动的标志
let isServerStarted = false;

// 中间件配置
app.use(cors());
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));

// 静态文件服务
app.use(express.static(path.join(__dirname, 'public')));
app.use('/exports', express.static(path.join(__dirname, 'public/exports')));
app.use('/templates', express.static(path.join(__dirname, 'public/templates')));

// 确保必要的目录存在
const ensureDirectories = () => {
    const dirs = [
        path.join(__dirname, 'public'),
        path.join(__dirname, 'public/exports'),
        path.join(__dirname, 'public/templates'),
        path.join(__dirname, 'uploads')
    ];
    
    dirs.forEach(dir => {
        if (!fs.existsSync(dir)) {
            fs.mkdirSync(dir, { recursive: true });
            console.log(`创建目录: ${dir}`);
        }
    });
};

// API路由
app.use('/api', userRoutes);
app.use('/api/admin', adminRoutes);

// 根路径重定向到用户端
app.get('/', (req, res) => {
    res.redirect('/user.html');
});

// 健康检查接口
app.get('/api/health', (req, res) => {
    res.json({
        status: 'ok',
        message: '维修上报系统运行正常',
        timestamp: new Date().toISOString(),
        version: '1.0.0'
    });
});

// 404处理
app.use((req, res) => {
    res.status(404).json({
        success: false,
        message: '接口不存在'
    });
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error('服务器错误:', err);
    res.status(500).json({
        success: false,
        message: '服务器内部错误',
        error: process.env.NODE_ENV === 'development' ? err.message : '服务器错误'
    });
});

// 初始化数据库和启动服务器
const startServer = async () => {
    if (isServerStarted) {
        console.log('服务器已经启动，跳过重复启动');
        return;
    }
    
    try {
        console.log('正在初始化维修上报系统...');
        
        // 确保目录存在
        ensureDirectories();
        
        // 初始化数据库
        await database.init();
        console.log('数据库初始化完成');
        
        // 定期清理过期的导出文件（每小时执行一次）
        setInterval(() => {
            exportUtils.cleanupExportFiles(24); // 清理24小时前的文件
        }, 60 * 60 * 1000);
        
        // 启动服务器
        app.listen(PORT, () => {
            isServerStarted = true;
            console.log(`\n=================================`);
            console.log(`维修上报系统已启动`);
            console.log(`服务器地址: http://localhost:${PORT}`);
            console.log(`用户端: http://localhost:${PORT}/user.html`);
            console.log(`管理端: http://localhost:${PORT}/admin.html`);
            console.log(`API文档: http://localhost:${PORT}/api/health`);
            console.log(`=================================\n`);
        });
        
    } catch (error) {
        console.error('启动服务器失败:', error);
        process.exit(1);
    }
};

// 优雅关闭处理
let isShuttingDown = false;

const gracefulShutdown = async (signal) => {
    if (isShuttingDown) {
        console.log('\n强制退出...');
        process.exit(1);
    }
    
    isShuttingDown = true;
    console.log(`\n收到${signal}信号，正在关闭服务器...`);
    
    try {
        await database.close();
        console.log('数据库连接已关闭');
        process.exit(0);
    } catch (error) {
        console.error('关闭数据库连接失败:', error);
        process.exit(1);
    }
};

// 只在明确的退出信号时才关闭服务器
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));

// 捕获未处理的异常，但不自动退出
process.on('uncaughtException', (error) => {
    console.error('未捕获的异常:', error);
    // 不自动退出，让服务器继续运行
});

process.on('unhandledRejection', (reason, promise) => {
    console.error('未处理的Promise拒绝:', reason);
    // 不自动退出，让服务器继续运行
});

// 启动应用
if (require.main === module) {
    startServer();
}

module.exports = app;